﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SmsApi
{
    public class SmsMessage
    {
        /// <summary>
        /// Treść wiadomości. Standardowo do 160 znaków lub 70 znaków w przypadku wystąpienia chociaż jednego znaku specjalnego (polskie znaki uważane są za specjalne)
        /// </summary>
        private string message;

        public string Message
        {
            get { return message; }
            set { message = value; }
        }

        /// <summary>
        /// Nazwa nadawcy wiadomości. Pozostawienie pola pustego powoduje wysłanie wiadomości od „SMSAPI”. Przyjmowane są tylko nazwy zweryfikowane.
        ///(&from=aktywna_nazwa). Pole nadawcy należy dodać po zalogowaniu na stronie SMSAPI, w zakładce USTAWIENIA → POLA NADAWCY.
        /// </summary>
        private string from;

        public string From
        {
            get { return from; }
            set { from = value; }
        }

        /// <summary>
        ///  Nazwa grupy kontaktów z książki telefonicznej, do których ma zostać wysłana wiadomość
        /// </summary>
        private string group;

        public string Group
        {
            get { return group; }
            set { group = value; }
        }

        /// <summary>
        /// Lista odbiorcow. Numer odbiorcy wiadomości w formacie 48xxxxxxxxx lub xxxxxxxxx. Np. 48505602702 lub 505602702
        /// </summary>
        private List<SmsAddress> to;

        public List<SmsAddress> To
        {
            get { return to; }
            set { to = value; }
        }

        /// <summary>
        /// Parametr określa kodowanie polskich znaków w SMS-ie. Domyślne kodowanie jest windows-1250. Jeżeli występuje konieczność zmiany kodowania, należy użyć
        /// parametru encoding z danymi: 
        /// - dla iso-8859-2 (latin2) – należy podać wartość „iso-8859-2”,
        /// - dla utf-8 – należy podać wartość „utf-8”
        /// </summary>
        private string encoding;

        public string Encoding
        {
            get { return encoding; }
            set { encoding = value; }
        }

        /// <summary>
        /// Ustawienie 1 zabezpiecza przed wysłaniem wiadomości składających się z kilku części. (ERROR:12)
        /// </summary>
        private int single;

        public int Single
        {
            get { return single; }
            set { single = value; }
        }

        /// <summary>
        /// Ustawienie parametru &eco=1 spowoduje wysłanie wiadomości Eco (brak 
        /// możliwości wyboru pola nadawcy, wiadomość wysyłana z losowego numeru dziewięciocyfrowego)
        /// </summary>
        private int eco;

        public int Eco
        {
            get { return eco; }
            set { eco = value; }
        }

        /// <summary>
        /// Ustawienie 1 zabezpiecza przed wysłaniem wiadomości ze znakami specjalnymi (w tym polskimi) (ERROR:11).
        /// </summary>
        private int nounicode;

        public int Nounicode
        {
            get { return nounicode; }
            set { nounicode = value; }
        }

        /// <summary>
        /// Ustawienie 1 spowoduje wysłanie wiadomości przy wykorzystaniu osobnego kanału zapewniającego szybkie doręczenie wiadomości Fast. Z parametru korzystać można
        /// podczas wysyłania wiadomości Pro oraz Eco, Ilość punktów za wysyłkę pomnożona 
        /// będzie przez 1.5 Uwaga! Dla tego parametru zabronione jest prowadzenie wysyłek
        /// masowych i marketingowych
        /// </summary>
        private int fast;

        public int Fast
        {
            get { return fast; }
            set { fast = value; }
        }

        /// <summary>
        ///  Wiadomość nie jest wysyłana, wyświetlana jest jedynie odpowiedź (w celach testowych). (&test=1)
        /// </summary>
        private int test;

        public int Test
        {
            get { return test; }
            set { test = value; }
        }

        /// <summary>
        /// W odpowiedzi zawarte jest więcej szczegółów. (Treść wiadomości, długość 
        /// wiadomość, ilość części z jakich składa się wiadomość). (&details=1)
        /// </summary>
        private int details;

        public int Details
        {
            get { return details; }
            set { details = value; }
        }

        /// <summary>
        ///  Wysyłanie wiadomości trybem „flash”, odbywa się poprzez podanie parametru flash
        ///  o wartości „1”. SMS-y flash są automatycznie wyświetlane na ekranie głównym
        ///  telefonu komórkowego i nie są przechowywane w skrzynce odbiorczej (jeśli nie
        ///  zostaną zapisane). (&flash=1)
        /// </summary>
        private int flash;

        public int Flash
        {
            get { return flash; }
            set { flash = value; }
        }

        /// <summary>
        /// Opcjonalny parametr użytkownika wysyłany z wiadomością a następnie zwracany przy wywołaniu zwrotnym CALLBACK. (&idx=123) 
        /// </summary>
        private int idx;

        public int Idx
        {
            get { return idx; }
            set { idx = value; }
        }

        /// <summary>
        /// Data w formacie unix timestamp. Określa kiedy wiadomość ma być wysłana.
        /// (&date=1287734110). W przypadku wstawienia daty przeszłej wiadomość zostanie
        /// wysłana od razu.
        /// </summary>
        private double date;

        public double Date
        {
            get { return date; }
            set { date = value; }
        }

        /// <summary>
        /// Parametr pozwalający na wysyłanie wiadomości WAP PUSH. (&datacoding=bin)
        /// </summary>
        private string datacoding;

        public string Datacoding
        {
            get { return datacoding; }
            set { datacoding = value; }
        }


        private int points;

        public int Points
        {
            get { return points; }
            set { points = value; }
        }

        public SmsMessage(string msg, List<SmsAddress> to, int eco)
        {
            this.message = msg;
            this.to = to;
            this.eco = eco;

            this.group = "";
            this.from = String.Empty;
            this.encoding = "";
            this.single = 0;
            this.nounicode = 0;
            this.fast = 0;
            this.test = 0;
            this.details = 0;
            this.date = 0;
            this.datacoding = "";
            this.flash = 0;
            this.idx = 0;
            this.points = 0;
        }

        public SmsMessage() : this("", new List<SmsAddress>(), 0) { }
        

        /// <summary>
        /// method for converting a System.DateTime value to a UNIX Timestamp
        /// </summary>
        /// <param name="value">date to convert</param>
        /// <returns></returns>
        public double ConvertToTimestamp(DateTime value)
        {
            //create Timespan by subtracting the value provided from
            //the Unix Epoch
            TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());

            //return the total seconds (which is a UNIX timestamp)
            return (double)span.TotalSeconds;
        }

        /// <summary>
        /// method for converting a UNIX Timestamp value to a System.DateTime
        /// </summary>
        /// <param name="value">date to convert</param>
        /// <returns></returns>
        public DateTime TimestamptoDateTime(double value)
        {            
            DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();            
            return date.AddSeconds(value);
        }


        
    }
}
